import baseApi from './baseApi';
import TokenManager from './tokenManager';
import type { MessageInstance } from 'antd/es/message/interface';
import type { TokenPayload } from './tokenManager';

// 登录请求参数接口
export interface LoginParams {
  username: string;
  password: string;
}

// 登录响应接口
export interface LoginResponse {
  data: {
    token: string;
    refreshToken: string;
  };
}

// 刷新Token请求参数接口
export interface RefreshTokenParams {
  refreshToken: string;
}

// 刷新Token响应接口
export interface RefreshTokenResponse {
  code: number;
  message: string;
  data: {
    token: string;
    refreshToken: string;
  };
}

// 认证相关服务
const authService = {
  /**
   * 用户登录
   * @param username 用户名
   * @param password 密码
   * @param message 消息实例
   * @returns 登录响应数据
   */
  login: async (username: string, password: string, message?: MessageInstance): Promise<LoginResponse> => {
    try {
      const response = await baseApi.post<LoginResponse>('/admin/login', { username, password });
      console.log('response', response);
      // 登录成功后，使用TokenManager设置Token
      if (response.data.data.token) {
        TokenManager.setTokens(response.data.data.token, response.data.data.refreshToken);
      }
      
      return response.data;
    } catch (error) {
      message?.error('登录失败，请检查用户名和密码');
      throw error;
    }
  },

  /**
   * 退出登录
   * @param message 消息实例
   */
  logout: async (message?: MessageInstance): Promise<void> => {
    try {
      await baseApi.post('/admin/logout');
      // 使用TokenManager清除Token
      TokenManager.clearTokens();
      message?.success('成功退出登录');
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    } catch (error) {
      // 即使API调用失败，也清除本地token
      TokenManager.clearTokens();
    }
  },

  /**
   * 手动刷新Token
   * 注意：通常不需要手动调用，baseApi会自动处理Token刷新
   * @param refreshToken 刷新Token
   * @returns 新的Token信息
   */
  refreshToken: async (refreshToken: string): Promise<RefreshTokenResponse> => {
    try {
      const response = await baseApi.post<RefreshTokenResponse>('/admin/token/refresh', { 
        refreshToken 
      });
      
      // 刷新成功后，使用TokenManager更新Token
      if (response.data.code === 0 && response.data.data) {
        TokenManager.setTokens(response.data.data.token, response.data.data.refreshToken);
      }
      
      return response.data;
    } catch (error) {
      console.error('手动刷新Token失败:', error);
      throw error;
    }
  },

  /**
   * 检查Token是否存在
   * 注意：这只检查本地存储中是否有token，不验证token的有效性
   */
  hasToken: (): boolean => {
    return !!TokenManager.getToken();
  },

  /**
   * 检查是否有RefreshToken
   */
  hasRefreshToken: (): boolean => {
    return !!TokenManager.getRefreshToken();
  },

  /**
   * 获取当前Token
   */
  getToken: (): string | null => {
    return TokenManager.getToken();
  },

  /**
   * 获取当前RefreshToken
   */
  getRefreshToken: (): string | null => {
    return TokenManager.getRefreshToken();
  },

  /**
   * 清除所有认证信息
   */
  clearAuth: (): void => {
    TokenManager.clearTokens();
  },

  /**
   * 设置认证信息
   * @param token 访问Token
   * @param refreshToken 刷新Token
   */
  setAuth: (token: string, refreshToken: string): void => {
    TokenManager.setTokens(token, refreshToken);
  },

  /**
   * 检查是否已登录
   * 使用TokenManager进行更精确的验证
   */
  isAuthenticated: (): boolean => {
    return TokenManager.isAuthenticated();
  },

  /**
   * 获取当前用户信息
   * @returns 用户信息，如果未登录则返回null
   */
  getCurrentUser: (): TokenPayload | null => {
    return TokenManager.getCurrentUser();
  },

  /**
   * 检查Token是否即将过期
   * @param thresholdMinutes 阈值分钟数，默认5分钟
   * @returns 是否即将过期
   */
  isTokenExpiringSoon: (thresholdMinutes: number = 5): boolean => {
    const token = TokenManager.getToken();
    if (!token) {
      return false;
    }
    return TokenManager.isTokenExpiringSoon(token, thresholdMinutes);
  },

  /**
   * 获取Token剩余时间的友好显示
   * @returns 友好的剩余时间显示
   */
  getTokenTimeDisplay: (): string => {
    const token = TokenManager.getToken();
    if (!token) {
      return '未登录';
    }
    return TokenManager.getTimeToExpireDisplay(token);
  },

  /**
   * 获取当前Token的详细信息
   * @returns Token信息对象，如果没有Token则返回null
   */
  getTokenInfo: () => {
    return TokenManager.getCurrentTokenInfo();
  }
};

export default authService; 